package com.example.study2;

import java.util.ArrayList;

public class ArrayListCopy {
    public static void main(String[] args) {
        // 创建原始列表，包含StringBuilder对象
        ArrayList<StringBuilder> originalList = new ArrayList<>();
        originalList.add(new StringBuilder("Hello"));
        originalList.add(new StringBuilder("World"));

        System.out.println("原始列表内容: " + getStringContents(originalList));
        // 输出：原始列表内容: [Hello, World]

        // 1. 浅拷贝
        System.out.println("\n--- 浅拷贝 ---");
        ArrayList<StringBuilder> shallowCopy = new ArrayList<>(originalList);  // 浅拷贝

        System.out.println("浅拷贝后 - 两个列表内容相同:");
        System.out.println("原始列表: " + getStringContents(originalList));
        System.out.println("浅拷贝列表: " + getStringContents(shallowCopy));
        /*输出：
        --- 浅拷贝 ---
        浅拷贝后 - 两个列表内容相同:
        原始列表: [Hello, World]
        浅拷贝列表: [Hello, World]
        */

        // 修改原始列表中的对象
        System.out.println("\n修改原始列表的第一个元素...");
        originalList.get(0).append(" Java");

        System.out.println("修改后 - 两个列表都发生了变化:");
        System.out.println("原始列表: " + getStringContents(originalList));
        System.out.println("浅拷贝列表: " + getStringContents(shallowCopy));
        System.out.println("说明：两个列表共享相同的对象引用！");
        /*输出：
        修改原始列表的第一个元素...
        修改后 - 两个列表都发生了变化:
        原始列表: [Hello Java, World]
        浅拷贝列表: [Hello Java, World]
        说明：两个列表共享相同的对象引用！*/

        // 2. 深拷贝
        System.out.println("\n--- 深拷贝 ---");
        ArrayList<StringBuilder> deepCopy = createDeepCopy(originalList);  // 深拷贝

        System.out.println("深拷贝后 - 两个列表内容相同:");
        System.out.println("原始列表: " + getStringContents(originalList));
        System.out.println("深拷贝列表: " + getStringContents(deepCopy));
        /*
        --- 深拷贝 ---
        深拷贝后 - 两个列表内容相同:
        原始列表: [Hello Java, World]
        深拷贝列表: [Hello Java, World]
        */

        // 再次修改原始列表
        System.out.println("\n再次修改原始列表的第一个元素...");
        originalList.get(0).append(" Programming");

        System.out.println("修改后 - 只有原始列表发生变化:");
        System.out.println("原始列表: " + getStringContents(originalList));
        System.out.println("深拷贝列表: " + getStringContents(deepCopy));
        System.out.println("说明：深拷贝创建了独立的对象，不受影响！");
        /*
        再次修改原始列表的第一个元素...
        修改后 - 只有原始列表发生变化:
        原始列表: [Hello Java Programming, World]
        深拷贝列表: [Hello Java, World]
        说明：深拷贝创建了独立的对象，不受影响！
*/
    }

    /**
     * 创建深拷贝 - 复制对象内容而非引用
     *
     * @param original 原始列表
     * @return 深拷贝后的新列表
     */
    public static ArrayList<StringBuilder> createDeepCopy(ArrayList<StringBuilder> original) {
        ArrayList<StringBuilder> copy = new ArrayList<>();  // 创建新列表
        for (StringBuilder sb : original) {                 // 遍历原始列表
            // 创建新的StringBuilder对象，复制内容
            copy.add(new StringBuilder(sb.toString()));     // 深拷贝关键步骤
        }
        return copy;
    }

    /**
     * 辅助方法：获取StringBuilder列表的内容字符串
     *
     * @param list 包含StringBuilder的列表
     * @return 包含字符串内容的列表
     */
    public static ArrayList<String> getStringContents(ArrayList<StringBuilder> list) {
        ArrayList<String> contents = new ArrayList<>();
        for (StringBuilder sb : list) {
            contents.add(sb.toString());  // 将StringBuilder转换为String
        }
        return contents;
    }
}